package com.xbts.screen.monitor.domain.token;

import com.alibaba.fastjson.JSON;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * token存储方式为Redis
 * TODO: JDK版本需jdk7及以上,springboot版本需在2.0.0及以上
 */
public class RedisTokenStore implements TokenStore {

    private RedisTemplate<String, String> redisTemplate;
    public static final String hashKey = "key_scene:token_hash_key";
    public static final Object lock = new Object();

    public RedisTokenStore(){}

//    public RedisTemplate getRedisTemplate(){
//        if(redisTemplate == null){
//            synchronized (lock){
//                if(redisTemplate == null){
//                    redisTemplate = new RedisTemplate();
//                    JedisConnectionFactory fac = new JedisConnectionFactory(getRedisStandaloneConfiguration());
//                    fac.afterPropertiesSet();
//
//                    redisTemplate.setConnectionFactory(fac);
//                    redisTemplate.afterPropertiesSet();
//                    RedisSerializer stringSerializer = new StringRedisSerializer();
//                    redisTemplate.setKeySerializer(stringSerializer);
//                    redisTemplate.setValueSerializer(stringSerializer);
//                    redisTemplate.setHashKeySerializer(stringSerializer);
//                    redisTemplate.setHashValueSerializer(stringSerializer);
//                }
//            }
//        }
//        return redisTemplate;
//    }
    /**
     * 存储token
     * @param:key 键
     * @param:token 值
     * **/
    public void tokenStore(String key, Token token){
        redisTemplate.opsForHash().put(hashKey, key, JSON.toJSONString(token));
    }

    /**
     * 获取token
     * @return Map<String, String>
     * **/
    public Map<String, Token> getToken(){
        Map tokenFromRedis = redisTemplate.opsForHash().entries(hashKey);
        Map<String, Token> tokens = new HashMap<String, Token>();
        if(!CollectionUtils.isEmpty(tokenFromRedis)){
            Set set = tokenFromRedis.entrySet();
            Iterator iterator = set.iterator();
            while(iterator.hasNext()){
                Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();
                tokens.put(entry.getKey(), JSON.parseObject(entry.getValue(), Token.class));
            }
        }
        return tokens;
    }

    /**
     * 更新token
     * @param key
     * @param token
     * **/
    public void updateToken(String key, Token token){
        tokenStore(key, token);
    }

    /**
     * 清空token
     * **/
    public void clearToken(){
        redisTemplate.delete(hashKey);
    }

    /**
     * 加载配置信息
     * **/
//    public RedisStandaloneConfiguration getRedisStandaloneConfiguration(){
//        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
//        Properties properties = new Properties();
//        try{
//            //加载配置信息
//            properties.load(this.getClass().getClassLoader().getResourceAsStream("application.properties"));
//            String host = properties.getProperty("spring.redis.host");
//            String port = properties.getProperty("spring.redis.port");
//            String password = properties.getProperty("spring.redis.password");
//            //设置数据源
//            redisStandaloneConfiguration.setHostName(host);
//            redisStandaloneConfiguration.setPort(Integer.parseInt(port));
//            //redisStandaloneConfiguration.setPassword(password);
//        }catch (IOException e){
//            e.printStackTrace();
//        }
//
//        return redisStandaloneConfiguration;
//    }

//    public static void main(String[] args) {
//        String key = "000adc8888888";
//        Token token = JSON.parseObject("{\n" +
//                "    \"access_token\": \"1:186fc877-6ab6-43d5-8d49-6311c47968a5\",\n" +
//                "    \"token_type\": \"password\",\n" +
//                "    \"refresh_token\": \"1:186fc877-6ab6-43d5-8d49-6311c47968a5\",\n" +
//                "    \"expires_in\": 121221,\n" +
//                "    \"scope\": \"all\",\n" +
//                "    \"userId\": \"0\",\n" +
//                "    \"magicId\": \"10.35.239.100\",\n" +
//                "    \"remainderDays\": 999,\n" +
//                "    \"ttl\": 58880\n" +
//                "}", Token.class);
//        new RedisTokenStore().updateToken(key, token);
//        //new RedisTokenStore().clearToken();
//
//    }
}
